package com.hxk.di.config;

import com.hxk.di.bean.Book;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 使用@Autowired注解完成自动装配
 *  @Autowired自动装配规则为：
 *      优先根据类型到ioc容器中去找对象，
 *          如果找不到，
 *              在判断属性上有没有标注Qualifier注解，
 *              有，根据Qualifier给定的规则到ioc容器中找，
 *              如果没有Qualifier注解，
 *                  那么会根据name到ioc容器中查找，
 *                      如果找到赋值，
 *                      找不到，报异常
 *          如果找到，直接赋值
 */
@ComponentScan("com.hxk.di")
@Configuration
public class MainConfigAutowired {


    /**
     * 向IOC容器中注册两个book对象实例，名称分别为book和book1
     *      查看bookdao中@Autowired到底注册的是那个类型的book实例
     *          经测试，使用的是book，
     *      ioc容器如果找到多个类型相同的实例时，
     *          1、ioc容器会再使用名称（@Autowire对应的属性名）到ioc容器中查找并注入
     *          2、如果要明确指定注入时注入那个实例，可以使用@Qualifier("book1")来指定
     *          3、使用@Primary注解，告诉ioc容器，当发现多个类型时，优先注入标有@Primary注解的实例
     * @return
     */
    @Primary
    @Bean("book1")
    public Book book(){
        return new Book("C++ 编程思想", 100.0);
    }

}
